#include <assert.h>
#include "digital_io.h"
#include "sr_output.h"

#define RESET 0
#define SET 1

//***********************************************************************************
//               Digital_Output_Init
//***********************************************************************************
void DO_Init(void){
  unsigned char i;
  for ( i=0;i<MAX_BYTE_OUTPUT_IO;i++){
    Digital_Output[i]=0x00;
  } 
}


//***********************************************************************************
//               Digital_Input_Init
//***********************************************************************************
void DI_Init(void){
  unsigned char i;
  for (i=0;i<MAX_BYTE_INPUT_IO;i++){
    Digital_Input[i]=0x00;
  } 
  for (i=0;i<MAX_BYTE_OUTPUT_IO_TEMP;i++){
    Digital_Output_Temp[i]=0x00;
  } 
}

//***********************************************************************************
//                Digital_Output_Set_Reset
//***********************************************************************************

void DO_Set_Reset(unsigned char state,unsigned char Set_Reset){
unsigned char Byte_count,Bit_count,IndexOutput;
  if (state>MAX_NUM_OUTPUT_IO) assert ("Digital Output non consentito");
  for (Byte_count=0;Byte_count<MAX_BYTE_OUTPUT_IO;Byte_count++){
    for (Bit_count=0;Bit_count<8;Bit_count++){
      IndexOutput=(Byte_count<<3)+Bit_count;
      if (IndexOutput==state) {
        if (Set_Reset==SET) Digital_Output[Byte_count]|=1<<Bit_count;
        if (Set_Reset==RESET)  Digital_Output[Byte_count]&=~(1<<Bit_count);
        return;
      }
    }
  
  }
}

//***********************************************************************************
//                Digital_Output_Set
//***********************************************************************************
void DO_Set(unsigned char state){
DO_Set_Reset(state,SET);
}

//***********************************************************************************
//                Digital_Output_Reset
//***********************************************************************************
void DO_Reset(unsigned char state){
DO_Set_Reset(state,RESET);
}


//***********************************************************************************
//                Digital_Output_Set_Temp
//***********************************************************************************
void DO_Set_Temp(unsigned char state,unsigned char Out_Temp){
Digital_Output_Temp[state]|=(1<<Out_Temp);
}

//***********************************************************************************
//                Digital_Output_Reset_Temp
//***********************************************************************************
void DO_Reset_Temp(unsigned char state,unsigned char Out_Temp){
Digital_Output_Temp[state]&=~(1<<Out_Temp);
}

//***********************************************************************************
//                Digital_Output_Temp_Test
//***********************************************************************************
bool DO_Temp_Test(unsigned char state,unsigned char netmask){
  return (Digital_Output_Temp[state]&netmask);
}

//***********************************************************************************
//                Digital_Input_Test
//***********************************************************************************
bool DI_Test(unsigned char state){
unsigned char Byte_count,Bit_count,IndexInput;
  if (state>MAX_NUM_INPUT_IO) assert ("Digital Output non consentito");
  for (Byte_count=0;Byte_count<MAX_BYTE_INPUT_IO;Byte_count++){
    for (Bit_count=0;Bit_count<8;Bit_count++){
      IndexInput=(Byte_count<<3)+Bit_count;
      if (IndexInput==state) {
        return ((Digital_Input[Byte_count]>>Bit_count)&0x01);
      }
    }
  
  }
  return false;
}


//***********************************************************************************
//                Digital_Input_Reset
//***********************************************************************************
void DI_Reset(void){
   DI_Init();
}

//**********************************************************************
//						  Set_Led_Tasto_Start
//**********************************************************************
void Set_Led_Tasto_Start(void){
	DO_Set(LED_TASTO_START);
	SR_Output_Write();
}



//**********************************************************************
//						  Set_Led_Tasto_Stop
//**********************************************************************
void Set_Led_Tasto_Stop(void){
	DO_Set(LED_TASTO_STOP);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Led_Tasto_Reset
//**********************************************************************
void Set_Led_Tasto_Reset(void){
	DO_Set(LED_TASTO_RESET);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Led_Tasto_Piu
//**********************************************************************
void Set_Led_Tasto_Piu(void){
	DO_Set(LED_TASTO_PIU);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Led_Tasto_Meno
//**********************************************************************
void Set_Led_Tasto_Meno(void){
	DO_Set(LED_TASTO_MENO);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Led_Tasto_Zero
//**********************************************************************
void Set_Led_Tasto_Zero(void){
	DO_Set(LED_TASTO_ZERO);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Start
//**********************************************************************
void Reset_Led_Tasto_Start(void){
	DO_Reset(LED_TASTO_START);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Stop
//**********************************************************************
void Reset_Led_Tasto_Stop(void){
	DO_Reset(LED_TASTO_STOP);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Reset
//**********************************************************************
void Reset_Led_Tasto_Reset(void){
	DO_Reset(LED_TASTO_RESET);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Piu
//**********************************************************************
void Reset_Led_Tasto_Piu(void){
	DO_Reset(LED_TASTO_PIU);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Meno
//**********************************************************************
void Reset_Led_Tasto_Meno(void){
	DO_Reset(LED_TASTO_MENO);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Led_Tasto_Zero
//**********************************************************************
void Reset_Led_Tasto_Zero(void){
	DO_Reset(LED_TASTO_ZERO);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Elettromagn_Chiusura_Tramog
//**********************************************************************
void Set_Elettromagn_Chiusura_Tramog(void){
	DO_Set(ELETTROMAGN_CHIUSURA_TRAMOG);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Richiesta_Macchina_Monte
//**********************************************************************
void Set_Richiesta_Macchina_Monte(void){
	DO_Set(RICHIESTA_MACCHINA_MONTE);
	SR_Output_Write();
}
//**********************************************************************
//						  Set_Start_Confezionatrice
//**********************************************************************
void Set_Start_Confezionatrice(void){
	DO_Set(START_CONFEZIONATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Lampada_Rossa_Emerg
//**********************************************************************
void Set_Lampada_Rossa_Emerg(void){
	DO_Set(LAMPADA_ROSSA_EMERG);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Lampada_Gialla_Stop
//**********************************************************************
void Set_Lampada_Gialla_Stop(void){
	DO_Set(LAMPADA_GIALLA_STOP);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Lampada_Verde_Automatico
//**********************************************************************
void Set_Lampada_Verde_Automatico(void){
	DO_Set(LAMPADA_VERDE_AUTOMATICO);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Sirena
//**********************************************************************
void Set_Sirena(void){
	DO_Set(SIRENA);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Valvola_Retromarcia_Coclea
//**********************************************************************
void Set_Valvola_Retromarcia_Coclea(void){
	DO_Set(VALVOLA_RETROMARCIA_COCLEA);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Valvola_Clipsatrice
//**********************************************************************
void Set_Valvola_Clipsatrice(void){
	DO_Set(VALVOLA_CLIPSATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Valvola_Retromarcia_Clipsatrice
//**********************************************************************
void Set_Valvola_Retromarcia_Clipsatrice(void){
	DO_Set(VALVOLA_RETROMARCIA_CLIPSATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Rele_Richiesta_Etichetta
//**********************************************************************
void Set_Rele_Richiesta_Etichetta(void){
	DO_Set(RELE_RICHIESTA_ETICHETTA);
	SR_Output_Write();
}

//**********************************************************************
//						  Set_Buzzer
//**********************************************************************
void Set_Buzzer(void){
	DO_Set(BUZZER);
	SR_Output_Write();
}



//**********************************************************************
//						  Reset_Elettromagn_Chiusura_Tramog
//**********************************************************************
void Reset_Elettromagn_Chiusura_Tramog(void){
   DO_Reset(ELETTROMAGN_CHIUSURA_TRAMOG);
   SR_Output_Write();
}

//**********************************************************************
//						  Reset_Richiesta_Macchina_Monte
//**********************************************************************
void Reset_Richiesta_Macchina_Monte(void){
	DO_Reset(RICHIESTA_MACCHINA_MONTE);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Start_Confezionatrice
//**********************************************************************
void Reset_Start_Confezionatrice(void){
	DO_Reset(START_CONFEZIONATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Lampada_Rossa_Emerg
//**********************************************************************
void Reset_Lampada_Rossa_Emerg(void){
	DO_Reset(LAMPADA_ROSSA_EMERG);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Lampada_Gialla_Stop
//**********************************************************************
void Reset_Lampada_Gialla_Stop(void){
	DO_Reset(LAMPADA_GIALLA_STOP);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Lampada_Verde_Automatico
//**********************************************************************
void Reset_Lampada_Verde_Automatico(void){
	DO_Reset(LAMPADA_VERDE_AUTOMATICO);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Sirena
//**********************************************************************
void Reset_Sirena(void){
	DO_Reset(SIRENA);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Valvola_Retromarcia_Coclea
//**********************************************************************
void Reset_Valvola_Retromarcia_Coclea(void){
	DO_Reset(VALVOLA_RETROMARCIA_COCLEA);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Valvola_Clipsatrice
//**********************************************************************
void Reset_Valvola_Clipsatrice(void){
	DO_Reset(VALVOLA_CLIPSATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Valvola_Retromarcia_Clipsatrice
//**********************************************************************
void Reset_Valvola_Retromarcia_Clipsatrice(void){
	DO_Reset(VALVOLA_RETROMARCIA_CLIPSATRICE);
	SR_Output_Write();
}

//**********************************************************************
//						  Reset_Rele_Richiesta_Etichetta
//**********************************************************************
void Reset_Rele_Richiesta_Etichetta(void){
	DO_Reset(RELE_RICHIESTA_ETICHETTA);
	SR_Output_Write();
}


//**********************************************************************
//						  Reset_Buzzer
//**********************************************************************
void Reset_Buzzer(void){
	DO_Reset(BUZZER);
	SR_Output_Write();
}





